Skip to main content

第 4 章:Pod 分類 Namespaces

Namespaces 是什麼

Kubernetes 提供了抽象的 Cluster (virtual cluster) 的概念,讓我們能根據專案不同、執行團隊不同,或是商業考量,將原本擁有實體資源的單一 Kubernetes Cluster ,劃分成幾個不同的抽象的 Cluster (virtual cluster)

K8S cluster 內建 defaultkube-system 與 kube-public 這三個 namespaces

  • default

    預設的 Namespaces 名稱為 default,過去我們產生的物件像是 Deployment, Services 等若沒特別指定 Namespace 都是存放在名稱為 default 的 namespaces 中

  • kube-system

    在 Kubernetes 中,較特別的資源都會存放在 kube-system 這個 namespace。像是 kube-dns 或是 heapster 都是存放在該 namepsace 中。為了預防這些物件不小心被使用者刪除或更改導致集群毀損

  • kube-public

    kube-public 也是個特殊的 namespace,存放在裡面的物件可被所有的使用者讀取

Namespaces 特點

  • 在同一個 Kubernetes Cluster 中,每個 Namespaces 的名稱都是要獨特的
  • 當一個 Namespaces 被刪除時,在該 Namespace 裡的所有物件也會被刪除
  • 可以透過 Resource Quotas 限制一個 Namespaces 所可以存取的資源

建立 Namespaces

kubectl create namespace newspace
namespace "newspace" created

透過 kubectl get namespaces 可以查看剛創建好的 namespaces

切換預設 Namespaces

若要查看目前在哪個 Namespace 底下,可用以下指令

kubectl config view | grep namespace:

可以看到預設為 default。可以透過 kubectl config set-context 指令,將預設的指令切換為 newspace,指令如下:

kubectl config set-context \
> $(kubectl config current-context) \
>--namespace=newspace

Context "minikube" modified.

若再用指令查看目前預設的 namespace,可以發現原本的 default 變為 newspace 了,

刪除單一 Namespaces

kubectl delete namespaces newspace
namespace "newspace" deleted

需留意的是,default 與 kube-system 是無法被刪除的 namespaces

實作:限制某一 Namespaces 的運算資源

hellospace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: hellospace
---
apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-quotas
namespace: hellospace
spec:
hard:
requests.cpu: "1"
requests.memory: 1Gi
limits.cpu: "1"
requests.memory: 10Gi
---
apiVersion: v1
kind: ResourceQuota
metadata:
name: object-quotas
namespace: hellospace
spec:
hard:
services: "2"
services.loadbalancers: "1"
secrets: "1"
configmaps: "1"
replicationcontrollers: "10"

在 hellospace.yaml 中,我們新創建了一個 hellospace 的 namespace,且限制該 namespace

  • 運算資源 (compute-quotas)

    CPU 最多只有 1 core ,以及 memory 的使用被限制在 10Gi 以下

  • 物件資源(object-quotas)

    限制 hellospace 最多只能有 2 個 services 物件,且只能有 1 個 loadbalancer, secret, 以及 configmap。

使用 kubectl create 創建,

kubectl create -f ./hellospace.yaml
namespace "hellospace" created
resourcequota "compute-quotas" created
resourcequota "object-quotas" created

創建完之後,可用 kubectl get 查看在 hellospace 裡的 Resource Quotas

kubectl get resourcequotas -n hellospace
NAME AGE
compute-quotas 5m
object-quotas 5m

用 kubectl describe 分別查看 compute-quotas 與 object-quotas 的內容

  • compute-quotas
  • object-quotas

可以發現,在 hellospace 中已有一個 secret 物件,若這時我們再創建一個新的 secret 物件,會發生什麼事呢,會看到 Kubernetes 發出 超出可允許的使用 quota 警告。代表 hellospace 受 comput-quotas 與 object-quotas 的限制